package br.com.websec.cnab;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import br.com.websec.configuracao.CnabConfiguracao;
import br.com.websec.configuracao.CnabConfiguracaoRN;
import br.com.websec.endereco.Endereco;
import br.com.websec.endereco.EnderecoRN;
import br.com.websec.fornecedor.Fornecedor;
import br.com.websec.fornecedor.FornecedorRN;
import br.com.websec.titulo.Titulo;
import br.com.websec.titulo.TituloRN;
import br.com.websec.usuario.Usuario;
import br.com.websec.util.ContextoUtil;
import br.com.websec.util.FuncoesUtil;
import br.com.websec.util.UtilException;
import br.com.websec.web.ContextoBean;

public class GeraRemessaCNAB {

	Cabecalho remessaCabecalho = new Cabecalho(); 
	Detalhe remessaDetalhe = new Detalhe();
	Rodape remessaRodape = new Rodape();
	FuncoesUtil funcoes = new FuncoesUtil();

	public List<Titulo> titulo(Integer fornecedor) {

		List<Titulo> lista = new ArrayList<Titulo>();
		TituloRN tRN = new TituloRN();
		lista = tRN.buscarPorStatusPendente(fornecedor);
		return lista;
	}

	public void gerarArquivoCnab( List<Titulo> lista, Integer fornecedor) throws IOException, UtilException{
		
		FornecedorRN fRN = new FornecedorRN();
		Fornecedor f = fRN.buscarPorId(fornecedor);
		
		
		if (!lista.isEmpty()) {
			
			System.out.println("Gerando arquivo CNAB...");
			
			int sequencialRegistro = 2;
			
			Integer codigoBanco = 341;
			
			String cabecalhoItau = "";
			String detalheItau = "";
			String rodapeItau = "";
			
			String cabecalhoBancoDoBrasil = "";
			String detalheBancoDoBrasil = "";
			String rodapeBancoDoBrasil = "";
			
			// Gerando dados de Cabecalho
			
			if (Integer.valueOf(codigoBanco) == 341){
				
				cabecalhoItau = gerarRemessaCabecalho(1, codigoBanco);

				
			}
			if (Integer.valueOf(codigoBanco) == 1){
				
				cabecalhoBancoDoBrasil = gerarRemessaCabecalho(1, codigoBanco);
				
			}
			
			//Gerando dados de Detalhe
			
			for (Titulo titulo : lista) {
				
				codigoBanco  = 341;//Integer.valueOf(titulo.getCabecalhoTitulo().getCodigoBanco());
				
				if (Integer.valueOf(codigoBanco) == 341){
					
					detalheItau = detalheItau+gerarRemessaDetalhe(titulo, sequencialRegistro);
					sequencialRegistro++;
					System.out.println(sequencialRegistro);
					
				}
				
				if (Integer.valueOf(codigoBanco) == 1){
					
					detalheItau = detalheItau+gerarRemessaDetalhe(titulo, sequencialRegistro);
					sequencialRegistro++;
					System.out.println(sequencialRegistro);

					
				}
				
		
			}
			
			//Gerando dados de Rodapé
			
			
			if (Integer.valueOf(codigoBanco) == 341){
				
				rodapeItau = gerarRemessaRodape(remessaCabecalho.getCodigoBanco(), remessaCabecalho.getConta(), lista.size(), sequencialRegistro);
				
			}
			
			
			if (Integer.valueOf(codigoBanco) == 1){
				
				rodapeBancoDoBrasil = gerarRemessaRodape(remessaCabecalho.getCodigoBanco(), remessaCabecalho.getConta(), lista.size(), sequencialRegistro);
				
			}
			
			
		    if (!detalheItau.isEmpty()){
		    	
				System.out.println("Arquivo(s) CNAB gerado(s)...");
		    	
			    FileWriter arqItau = new FileWriter("C:\\websec\\cnab\\cnabItau.txt");
			    PrintWriter gravarArq = new PrintWriter(arqItau);
		    	
		    	gravarArq.append(cabecalhoItau);
				gravarArq.append(detalheItau);
				gravarArq.append(rodapeItau);
				gravarArq.flush();
				gravarArq.close();
		    	
		    }
		    
		    if (!detalheBancoDoBrasil.isEmpty()){
		    	
		    	FileWriter arqBrancoDoBrasil = new FileWriter("C:\\websec\\cnab\\cnabBancoDoBrasil.txt");
			    PrintWriter gravarArqBancoDoBrasil = new PrintWriter(arqBrancoDoBrasil);
		    	
		    	gravarArqBancoDoBrasil.append(cabecalhoBancoDoBrasil);
				gravarArqBancoDoBrasil.append(detalheBancoDoBrasil);
				gravarArqBancoDoBrasil.append(rodapeBancoDoBrasil);
				gravarArqBancoDoBrasil.flush();
				gravarArqBancoDoBrasil.close();
				
		    	
		    }
			
			
		}
			
	}

	public String gerarRemessaCabecalho( Integer fornecedor, Integer codigoBanco) {

		FornecedorRN fRN = new FornecedorRN();
		Fornecedor f = fRN.buscarPorId(fornecedor);
		CnabConfiguracaoRN cRN = new CnabConfiguracaoRN();
		CnabConfiguracao cc = cRN.buscarPorFornecedor(f.getIdFornecedor());
		Date dataGeracao = new Date();

		this.remessaCabecalho.setCpfCnpjEmpresa(f.getCnpj());
		this.remessaCabecalho.setCodigoBanco(String.valueOf(codigoBanco));

		if (f.getCnpj().length() > 11) {
			this.remessaCabecalho.setTipoInscricaoEmpresa(01);
		} else {
			this.remessaCabecalho.setTipoInscricaoEmpresa(02);
		}

		this.remessaCabecalho.setRazaoEmpresa(f.getRazaoSocial());
		this.remessaCabecalho.setCpfCnpjEmpresa(f.getCnpj());
		this.remessaCabecalho.setCodigoConvenioBanco(cc.getConvenio());
		this.remessaCabecalho.setAgencia(cc.getAgencia());
		this.remessaCabecalho.setDigitoAgencia(cc.getDigitoAgencia());
		this.remessaCabecalho.setConta(cc.getConta());
		this.remessaCabecalho.setDigitoConta(cc.getDigitoConta());
		this.remessaCabecalho.setNomeBanco(cc.getBanco().getNomeBanco());
		this.remessaCabecalho.setDataGeracao(dataGeracao);
		this.remessaCabecalho.setSequenciaArquivo(1);

		try {
			String strCabecalho = remessaCabecalho.getLine();
			return strCabecalho;
		} catch (UtilException e) {
			e.printStackTrace();
		}
		return null;
	}

	public String gerarRemessaDetalhe(Titulo titulo, Integer sequencialRegistro) {

		TituloRN tRN = new TituloRN();
		Titulo t = tRN.buscarPorId(titulo.getIdTitulo());
		FornecedorRN fRN = new FornecedorRN();
		Fornecedor f = fRN
				.buscarPorId(titulo.getFornecedor().getIdFornecedor());
		EnderecoRN eRN = new EnderecoRN();
		Endereco end = eRN.buscarPorCliente(t.getCliente().getIdCliente());

		this.remessaDetalhe.setCodigoBanco(t.getBanco().getCodigoBanco()
				.toString());

		if (f.getCnpj().length() > 11) {
			this.remessaDetalhe.setTipoInscricaoEmpresa(1);
		} else {
			this.remessaCabecalho.setTipoInscricaoEmpresa(2);
		}

		this.remessaDetalhe.setCpfCnpjEmpresa(f.getCnpj());
		this.remessaDetalhe.setAgencia(t.getConta().getAgencia().getNumero());
		this.remessaDetalhe.setAceite(t.getAceite());
		this.remessaDetalhe.setDigitoAgencia(t.getConta().getAgencia().getDigito());
		this.remessaDetalhe.setConta(t.getConta().getNumeroConta());
		this.remessaDetalhe.setConta(t.getConta().getDigitoConta());
		this.remessaDetalhe.setRazaoEmpresa(f.getRazaoSocial());
		this.remessaDetalhe.setMensagem1(t.getMensagem1());
		this.remessaDetalhe.setMensagem2(t.getMensagem2());
		this.remessaDetalhe.setDataCredito(t.getDataCredito());
		this.remessaDetalhe.setDataLiquidacao(t.getDataLiquidacao());
		this.remessaDetalhe.setCodigoCarteira(1);
		this.remessaDetalhe.setCodigoCarteiraCnab(t.getCarteira().getCodigoCarteira().toString());
		this.remessaDetalhe.setIdentificaoTitulo(t.getIdentificacaoTitulo());
		this.remessaDetalhe.setIdentificacaoTituloEmpresa(t.getIdentificacaoTituloEmpresa());
		this.remessaDetalhe.setVariacaoCarteira(t.getCarteira().getVariacao());
		this.remessaDetalhe.setValorPercentualMulta(t.getValorPercentualMulta());
		this.remessaDetalhe.setCodigoMovimento(t.getCodigoMovimento());
		this.remessaDetalhe.setDocumentoCobranca(t.getDocumentoCobranca());
		this.remessaDetalhe.setDataVencimentoTitulo(t.getDtVencimento());

		this.remessaDetalhe.setValorTitulo(t.getValor());
		this.remessaDetalhe.setEspecieTitulo(t.getEspecie());
		this.remessaDetalhe.setDataEmissaoTitulo(t.getDtEmissao());
		this.remessaDetalhe.setCodigoJuros(t.getCodigoJuros());
		this.remessaDetalhe.setValorJurosTaxa(t.getValorJurosTaxa());
		this.remessaDetalhe.setDataDesconto(t.getDataDesconto());
		this.remessaDetalhe.setValorDesconto(t.getValorDesconto());
		this.remessaDetalhe.setValorIOF(t.getValorIOF());
		this.remessaDetalhe.setValorAbatimento(t.getValorAbatimento());
		this.remessaDetalhe.setValorJurosMulta(t.getValorjurosmulta());
		this.remessaDetalhe.setValorAbatimentoCancelado(t
				.getValorAbatimentoCancelado());
		this.remessaDetalhe.setValorPago(t.getValorPago());
		this.remessaDetalhe.setValorLiquidacaoCredito(t
				.getValorLiquidacaoCredito());
		this.remessaDetalhe.setValorOutrasDespesas(t.getValorOutrasDespesas());
		this.remessaDetalhe.setValorOutrosCreditos(t.getValorOutrosCreditos());
		this.remessaDetalhe.setValorOcorrenciaSacado(t
				.getValorOcorrenciaSacado());

		this.remessaDetalhe.setTipoInscricaoCliente(t.getTipoInscricaoCliente());
		this.remessaDetalhe.setCpfCnpjCliente(t.getCliente().getCnpj());
		this.remessaDetalhe.setRazaoCliente(t.getCliente().getRazaoSocial());
		this.remessaDetalhe.setEnderecoCliente(end.getLogradouro() +", "+ end.getNumero());
		this.remessaDetalhe.setBairroCliente(end.getBairro());
		this.remessaDetalhe.setCepCliente(funcoes.noFormat(end.getCep()));
		this.remessaDetalhe.setCidadeCliente(end.getCidade());
		this.remessaDetalhe.setSequencialregistro(sequencialRegistro);
		this.remessaDetalhe.setCodigoRejeicoes(t.getCodigoRejeicoes());
		this.remessaDetalhe.setInstrucoes(t.getInstrucoes());
		this.remessaDetalhe.setOutrasInstrucoes(t.getOutrasInstrucoes());

		try {
			String strCabecalho = remessaDetalhe.getLine("400");
			return strCabecalho;
		} catch (UtilException e) {

			e.printStackTrace();
		}
		return null;

	}

	public String gerarRemessaRodape(String codigoBanco, String codigoConta, int quantidadeRegistros, int sequencialRegistro) throws UtilException {

		
		this.remessaRodape.setCodBanco(codigoBanco);
		this.remessaRodape.setConta(codigoConta);
		this.remessaRodape.setQtdRegistros(quantidadeRegistros);
		this.remessaRodape.setSeqregistro(sequencialRegistro);
		
		return remessaRodape.getLine();

	}

	public Cabecalho getRemessaCabecalho() {
		return remessaCabecalho;
	}

	public void setRemessaCabecalho(Cabecalho remessaCabecalho) {
		this.remessaCabecalho = remessaCabecalho;
	}

	public Rodape getRemessaRodape() {
		return remessaRodape;
	}

	public void setRemessaRodape(Rodape remessaRodape) {
		this.remessaRodape = remessaRodape;
	}

	public Usuario getUsuarioLogado() {
		
		ContextoBean contexto = ContextoUtil.getContextoBean();
		Usuario u = contexto.getUsuarioLogado();
		return u;
	}

}
